package com.ys.service.sys.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;

import com.bo.enume.sys.StatusEnum;
import com.ys.dto.DtreeDto;
import com.ys.entity.sys.SysButton;
import com.ys.entity.sys.SysMenu;
import com.ys.entity.sys.SysRole;
import com.ys.entity.sys.SysRoleButton;
import com.ys.entity.sys.SysRoleMenu;
import com.ys.enume.sys.SysMenuEnum;
import com.ys.mapper.sys.SysMapper;
import com.ys.mapper.sys.SysRoleMapper;
import com.ys.service.sys.SysRoleService;
import com.ys.vo.R;


@Service("sysRoleService")
public class SysRoleServiceImpl implements SysRoleService {

	@Autowired
	private SysMapper sysMapper;
	@Autowired
	private SysRoleMapper sysRoleMapper;

	@Override
	public DtreeDto dtreeOfRole() {
		
		DtreeDto.StatusDto status = DtreeDto.StatusDto.init(200, "");

		List<DtreeDto.DataDto> data = new ArrayList<DtreeDto.DataDto>();
		List<SysRole> listMenuLev = new SysRole().setOrderby("A.id asc").queryList();
		// 一级菜单
		for(SysRole sysRole : listMenuLev) {
			Long id1 = sysRole.getId();
			String title1 = sysRole.getName();
			Long parentId1 = sysRole.getPid();
			
			// 二级菜单
			List<DtreeDto.DataDto> children = new ArrayList<DtreeDto.DataDto>();
			
			DtreeDto.DataDto dataDto1 = new DtreeDto.DataDto(id1, title1, parentId1, DtreeDto.DataDto.initCheckArr(null), children);
			data.add(dataDto1);
		}
		return new DtreeDto(status, data);
	}

	@Override
	public DtreeDto dtreeOfAuth(Long sysRoleId) {
		SysRole sysRole = new SysRole().setId(sysRoleId).queryFirst();
		
		DtreeDto.StatusDto status = DtreeDto.StatusDto.init(200, "");
		
		
		// 查询所有的一级菜单，用于遍历
		SysMenu condMenuOf1 = new SysMenu()
				.setLev(SysMenuEnum.Lev.ONE.value);
		if (sysRoleId.longValue() != 1L) {
			// 非超级管理员角色的账号登录
			if (sysRole.getPid().longValue() == 1L) {
				// 若上级角色ID是超级管理员，则加载自身所有权限
				condMenuOf1.where("A.id in (select menu_id from sys_role_menu where sys_role_id = " + sysRoleId + ")");
			} else {
				// 若上级角色ID不是超级管理员，则加载上级所有权限
				condMenuOf1.where("A.id in (select menu_id from sys_role_menu where sys_role_id = " + sysRole.getPid() + ")");
			}
		} else {
			// 超级管理员角色的账号登录
			if (sysRole.getPid().longValue() != 1L && sysRole.getPid().longValue() != 0L) {
				// 若上级角色ID不是超级管理员，则加载上级所有权限
				condMenuOf1.where("A.id in (select menu_id from sys_role_menu where sys_role_id = " + sysRole.getPid() + ")");
			}
		}
		condMenuOf1.setOrderby("A.sort_no asc,A.id asc");
		List<SysMenu> listMenuOf1 = condMenuOf1.queryList();
		
		// 查询所有的二级菜单，用于遍历
		SysMenu condMenuOf2 = new SysMenu()
				.setLev(SysMenuEnum.Lev.TWO.value);
		if (sysRoleId.longValue() != 1L) {
			// 非超级管理员角色的账号登录
			if (sysRole.getPid().longValue() == 1L) {
				// 若上级角色ID是超级管理员，则加载自身所有权限
				condMenuOf2.where("A.id in (select menu_id from sys_role_menu where sys_role_id = " + sysRoleId + ")");
			} else {
				// 若上级角色ID不是超级管理员，则加载上级所有权限
				condMenuOf2.where("A.id in (select menu_id from sys_role_menu where sys_role_id = " + sysRole.getPid() + ")");
			}
		} else {
			// 超级管理员角色的账号登录
			if (sysRole.getPid().longValue() != 1L && sysRole.getPid().longValue() != 0L) {
				// 若上级角色ID不是超级管理员，则加载上级所有权限
				condMenuOf2.where("A.id in (select menu_id from sys_role_menu where sys_role_id = " + sysRole.getPid() + ")");
			}
		}
		condMenuOf2.setOrderby("A.sort_no asc,A.id asc");
		List<SysMenu> listMenuOf2 = condMenuOf2.queryList();
		
		// 查找所有的角色-菜单
		List<SysRoleMenu> listRoleMenu = new SysRoleMenu().setRoleId(sysRoleId).queryList();
		List<Long> listMenuId = new ArrayList<Long>();
		for(SysRoleMenu roleMenu : listRoleMenu) {
			listMenuId.add(roleMenu.getMenuId());
		}
		// 查找所有的角色-按钮
		List<SysRoleButton> listRoleButton = new SysRoleButton().setRoleId(sysRoleId).queryList();
		List<Long> listButtonId = new ArrayList<Long>();
		for(SysRoleButton roleButton : listRoleButton) {
			listButtonId.add(roleButton.getButtonId());
		}
		List<DtreeDto.DataDto> childrenOfModule = new ArrayList<DtreeDto.DataDto>();
		for(SysMenu menuOf1 : listMenuOf1) {
			
			List<DtreeDto.DataDto> childrenOfMenu1 = new ArrayList<DtreeDto.DataDto>();
			for(SysMenu menuOf2 : listMenuOf2) {
				if (menuOf2.getPid().longValue() != menuOf1.getId().longValue()) {
					continue;
				}
				SysButton condButton = new SysButton()
						.setMenuId(menuOf2.getId());
				if (sysRoleId.longValue() != 1L) {
					// 非超级管理员角色的账号登录
					if (sysRole.getPid().longValue() == 1L) {
						// 若上级角色ID是超级管理员，则加载自身所有权限
						condButton.where("A.id in (select sys_button_id from sys_role_button where sys_role_id = " + sysRoleId + ")");
					} else {
						// 若上级角色ID不是超级管理员，则加载上级所有权限
						condButton.where("A.id in (select sys_button_id from sys_role_button where sys_role_id = " + sysRole.getPid() + ")");
					}
				} else {
					// 超级管理员角色的账号登录
					if (sysRole.getPid().longValue() != 1L && sysRole.getPid().longValue() != 0L) {
						// 若上级角色ID不是超级管理员，则加载上级所有权限
						condButton.where("A.id in (select sys_button_id from sys_role_button where sys_role_id = " + sysRole.getPid() + ")");
					}
				}
				condButton.setOrderby("A.id asc");
				List<DtreeDto.DataDto> childrenOfMenu2 = new ArrayList<DtreeDto.DataDto>();
				for(SysButton button : condButton.queryList()) {
					List<DtreeDto.DataDto> childrenOfButton = null;
					childrenOfMenu2.add(new DtreeDto.DataDto(button.getId(), button.getName(), button.getMenuId(),
							DtreeDto.DataDto.initCheckArr(listButtonId.contains(button.getId()) ? 1 : 0), childrenOfButton));
				}
				childrenOfMenu1.add(new DtreeDto.DataDto(menuOf2.getId(), menuOf2.getName(), menuOf2.getPid(),
						DtreeDto.DataDto.initCheckArr(listMenuId.contains(menuOf2.getId()) ? 1 : 0), childrenOfMenu2));
			}
			childrenOfModule.add(new DtreeDto.DataDto(menuOf1.getId(), menuOf1.getName(), menuOf1.getPid(),
					DtreeDto.DataDto.initCheckArr(listMenuId.contains(menuOf1.getId()) ? 1 : 0), childrenOfMenu1));
		}
		DtreeDto dto = new DtreeDto(status, childrenOfModule);
		return dto;
	}

	@Override
	public R addSubSysRole(Long pid, String name) {
		if (pid == null) {
			return R.error("上级角色ID不能为空");
		}
		
		// 验证名称
		if (name == null || name.length() == 0) {
			return R.error("名称不能为空");
		}
		
		SysRole pSysRole = new SysRole().setId(pid).queryFirst();
		if (pSysRole == null) {
			return R.error("上级角色不存在");
		}
		if (name == null || name.length() == 0) {
			return R.error("角色名称不能为空");
		}
		
		SysRole roleOfAdd = SysRole.sysRole(pid, name, 1);
		sysRoleMapper.insert(roleOfAdd);
		return R.ok();
	}

	@Override
	public R editSysRole(Long id, String name) {
		
		// 验证id
		if (id == null) {
			return R.error("ID不能为空");
		}
		
		// 验证名称
		if (name == null || name.length() == 0) {
			return R.error("名称不能为空");
		}
		
		SysRole entity = new SysRole().setId(id).queryFirst();
		
		entity.setName(name);
		
		sysRoleMapper.update(entity);
		
		return R.ok("操作成功");
	}

	@Override
	public String toEditSysRole(Model model, Long id) {
		
		SysRole entity = new SysRole().setId(id).queryFirst();
		String name = entity.getName();
		ToEditSysRoleDto dto = new ToEditSysRoleDto(id, name);
		
		model.addAttribute("dto", dto);
		
		return "sys/sysRole/toEditSysRole";
	}
}
